/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package robot_maker;

import Excepciones.AccesorioException;
import Excepciones.DinamicaDato;
import Excepciones.ProcesamientoDato;
import Excepciones.Sistema;
import Modelo.BaseDato;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


/**
 * La clase accesorio se encarga de almacenar accesorios necesarios para
 * crear un robot.
 *
 * @author CarlosScipione
 */
public class Accesorio {

    private int _id;
    private String _nombre;
    private String _caracteristicas;


/** Contruye el objeto accesorio
 *
 * @param nombre
 * @param caracteristicas
 * @throws AccesorioException
 */
    public Accesorio(String nombre, String caracteristicas) throws 
            AccesorioException {

        if ((nombre.isEmpty()) || (caracteristicas.isEmpty())){
            JOptionPane.showMessageDialog(null,
                    "Ningun campo debe ser vacio.");
            throw new AccesorioException(32,
                    "CAMPOS VACIOS DEL ACCESORIO",
                    "CONSTRUCTOR");
        }else{

        this._nombre = nombre.toUpperCase();
        this._caracteristicas = caracteristicas.toUpperCase();
        }
    }

    
/** Contruye el objeto accesorio con ninguna informacion
 *
 */
    public Accesorio() {
    }

/** Asocia un robot con un accesorios
 *
 * @param codRobot
 * @param codAccesorio
 * @throws BasesdeDatos
 */
    public void asociar(int codRobot, int codAccesorio) throws ProcesamientoDato{

        if (validarAsociacion(codRobot, codAccesorio)){
            try {
                BaseDato.ejecutarSqlInsert("insert into ASOCIACION (robot_id, "
                        + "accesorio_id) values (" + codRobot + ","
                        + codAccesorio + ")");
                JOptionPane.showMessageDialog(null, "Se agrego con exito.");
            } catch (DinamicaDato ex) {
  throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");            }
    }
        else
            JOptionPane.showMessageDialog(null,
                    "Esa asociacion ya existe.");

    }
/** Desasocia un robot con un accesorio
 *
 * @param codRobot
 * @param codAccesorio
 * @throws BasesdeDatos
 */
     public void desasociar(int codRobot, int codAccesorio) throws
             ProcesamientoDato{
        try {
            BaseDato.ejecutarSqlInsert("delete from ASOCIACION where robot_id='"
                    + codRobot + "' and accesorio_id='" + codAccesorio + "'");
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");        }


    }

   /** Valida si ya existe esa asociacion de robot con accesorio
    *
    * @param codRobot
    * @param codAccesorio
    * @return Boolean
    * @throws BasesdeDatos
    */
    public boolean validarAsociacion(int codRobot, int codAccesorio) throws
            ProcesamientoDato{

        ResultSet lista = null;
        try {
           lista = BaseDato.ejecutarSqlSelect("select count(*) from ASOCIACION "
                   + "where robot_id=" + codRobot + " and accesorio_id="
                   + codAccesorio);

            lista.next();
            if (lista.getInt(1) == 1)
            return false;
        else
            return true;
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        } catch (Exception ex) {
        Sistema.loggear(33, "validarAsociacion", "SQL SYNTAXIS",Accesorio.class,
                    "SQLException");
        }
        return true;
    }

    /** Inserta un accesorio en la base de datos
     *
     * @param nuevo
     * @throws SQLException
     * @throws BasesdeDatos
     * @throws AccesorioException
     */
     public void ingresarBD (Accesorio nuevo) throws AccesorioException,
             ProcesamientoDato{

         if(validarNombre(nuevo.getNombre()))
        

        try {
     BaseDato.ejecutarSqlInsert("insert into ACCESORIO (nombre,caracteristicas)"
             + " values ('" + nuevo.getNombre() + "','"
             + nuevo.getCaracteristicas() + "')");
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        }
    }



  /** Valida que el nombre del accesorio no se repita en la BD
   *
   * @param nombre
   * @return Boolean
   * @throws BasesdeDatos
   * @throws AccesorioException
   */
     public Boolean validarNombre(String nombre) throws AccesorioException,
             ProcesamientoDato{
        try {
            ResultSet lista = null;
            lista = BaseDato.ejecutarSqlSelect("select COUNT(*) from ACCESORIO "
                    + "where nombre='" + nombre.toUpperCase() + "'");

                lista.next();
                if (lista.getString(1).equals("0")) {
                    return true;
                } else {
                    JOptionPane.showMessageDialog(null, "Ese nombre ya existe.");
                    throw new AccesorioException(31,
                            "ESE ACCESORIO YA EXISTE EN LA BASE DE DATO",
                            "validarNombre");
                }

        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        } catch (Exception ex) {
                Sistema.loggear(31, "validarNombre", "SQL SYNTAXIS",
                        Accesorio.class, "SQLException");
            }
          return false;

      }


/** Obtiene los datos del Accesorio
 *
 * @param id
 * @return Accesorio
 * @throws SQLException
 * @throws BasesdeDatos
 */
     public Accesorio getDatos (int id) throws ProcesamientoDato{
                    Accesorio losa = new Accesorio();

         try {
            ResultSet lista = null;
            lista = BaseDato.ejecutarSqlSelect("select * from ACCESORIO where ID="
                    + id);
            losa.setId(id);
            lista.next();
            losa.setNombre(lista.getString(2));
            losa.setCaracteristicas(lista.getString(3));
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        } catch (Exception ex) {
        Logger.getLogger(Accesorio.class.getName()).log(Level.SEVERE, null, ex);
    }
                    return losa;

     }


/** Modifica los datos del accesorio
 *
 * @param nuevo
 * @param idOld
 * @throws BasesdeDatos
 * @throws AccesorioException
 */
    public void modificarBD (Accesorio nuevo, String idOld) throws 
            AccesorioException, ProcesamientoDato{
        try {
        if (!idOld.equals(nuevo.getNombre())){
            if(validarNombre(nuevo.getNombre()))

                BaseDato.ejecutarSqlInsert("update ACCESORIO set nombre='" +
                        nuevo.getNombre() + "', caracteristicas='" +
                        nuevo.getCaracteristicas() + "' where id=" +
                        nuevo.getId());

        }else{
        BaseDato.ejecutarSqlInsert("update ACCESORIO set caracteristicas='"
                + nuevo.getCaracteristicas() + "' where id=" +
                nuevo.getId());
         }
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");            }
    }


 /** Borra los datos del accesorio de la BD
  *
  * @param aEliminar
  * @param n
  * @throws BasesdeDatos
  */
    public void borrarBD(int aEliminar, int n) throws ProcesamientoDato{

        if(n == 0){
            try {
                BaseDato.ejecutarSqlInsert("delete from ACCESORIO where ID="
                        + aEliminar);
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");            }
        }
    }

    /** Obtiene el id del accesorio
     *
     * @return int
     */
    public int getId() {
        return _id;
    }

    /** Coloca el id en el objeto
     *
     * @param _id
     */
    public void setId(int id) {
        this._id = id;
    }

    /** Obtiene el nombre del accesorio
     *
     * @return String
     */
    public String getNombre() {
        return _nombre;
    }

    /** Coloca el Nombre del accesorio
     *
     * @param _nombre
     */
    public void setNombre(String nombre) {
        this._nombre = nombre;
    }

    /** Obtiene las caracteristicas del accesorio
     *
     * @return String
     */
    public String getCaracteristicas() {
        return _caracteristicas;
    }

    /** Coloca las caracteristicas del accesorio
     *
     * @param _caracteristicas
     * 
     */
    public void setCaracteristicas(String caracteristicas) {
        this._caracteristicas = caracteristicas;
    }

    


}
